<?php

namespace app\tool\controller;

use think\facade\Config;
use Firebase\JWT\JWT;

class tokenController
{
    static public function createToken($data = "", $exp_time = 0, $scopes = "")
    {
        //JWT标准规定的声明，但不是必须填写的；
        //iss: jwt签发者
        //sub: jwt所面向的用户
        //aud: 接收jwt的一方
        //exp: jwt的过期时间，过期时间必须要大于签发时间
        //nbf: 定义在什么时间之前，某个时间点后才能访问
        //iat: jwt的签发时间
        //jti: jwt的唯一身份标识，主要用来作为一次性token。
        //公用信息
        try {
            $key = Config::get('app.token_key');
            $time = time(); //当前时间
            //$token['iss']=''; //签发者 可选
            //$token['aud']=''; //接收该JWT的一方，可选
            $token['iat'] = $time; //签发时间
            $token['nbf'] = $time; //(Not Before)：某个时间点后才能访问，比如设置time+30，表示当前时间30秒后才能使用
            if ($scopes) {
                $token['scopes'] = $scopes; //token标识，请求接口的token
            }
            if (!$exp_time) {
                $exp_time = Config::get('app.token_exp_time');
            }
            $token['exp'] = $time + $exp_time; //token过期时间,这里设置2个小时
            if ($data) {
                $token['data'] = $data; //自定义参数
            }
            $json = JWT::encode($token, $key, 'HS256');
            $returndata['status'] = "200";//
            $returndata['msg'] = 'success';
            $returndata['token'] = $json;//返回的数据
            return $returndata; //返回信息
        } catch (\Firebase\JWT\ExpiredException $e) { //签名不正确
            $returndata['status'] = "104";//101=签名不正确
            $returndata['msg'] = $e->getMessage();
            $returndata['data'] = "";//返回的数据
            return $returndata; //返回信息
        } catch (\Exception $e) { //其他错误
            $returndata['status'] = "199";//199=签名不正确
            $returndata['msg'] = $e->getMessage();
            $returndata['data'] = "";//返回的数据
            return $returndata; //返回信息
        }
    }

    /**
     * 验证token是否有效,默认验证exp,nbf,iat时间
     * @param string $jwt 需要验证的token
     * @return string $msg 返回消息
     */
    static public function checkToken($jwt)
    {
        $key = Config::get('app.token_key');
        try {
            JWT::$leeway = 60;//当前时间减去60，把时间留点余地
//            $jwtKey  = new Key();
            $decoded = JWT::decode($jwt, new \Firebase\JWT\Key($key, 'HS256'));
            $arr = (array)$decoded;
            $returndata['status'] = "200";//200=成功
            $returndata['msg'] = "success";//
            $returndata['data'] = $arr;//返回的数据
            return $returndata; //返回信息
        } catch (\Firebase\JWT\SignatureInvalidException $e) { //签名不正确
            $returndata['status'] = "101";//101=签名不正确
            $returndata['msg'] = $e->getMessage();
            $returndata['data'] = "";//返回的数据
            return $returndata;
//            sendResponse($returndata, 401, 'Unauthorized');
        } catch (\Firebase\JWT\BeforeValidException $e) { // 签名在某个时间点之后才能用
            $returndata['status'] = "102";
            $returndata['msg'] = $e->getMessage();
            $returndata['data'] = "";//返回的数据
            return $returndata;
//            sendResponse($returndata, 401, 'Unauthorized');
        } catch (\Firebase\JWT\ExpiredException $e) { // token过期
            $returndata['status'] = "103";//103=签名不正确
            $returndata['msg'] = $e->getMessage();
            $returndata['data'] = "";//返回的数据
            return $returndata;
//            sendResponse($returndata, 401, 'Unauthorized');
        } catch (\Exception $e) { //其他错误
            $returndata['status'] = "199";//199=签名不正确
            $returndata['msg'] = $e->getMessage();
            $returndata['data'] = "";//返回的数据
            return $returndata;
//            sendResponse($returndata, 401, 'Unauthorized');
        }
    }
}
